#include "Driver_TIM6.h"
#include "lv_conf_internal.h"
#include "lv_timer.h"

/**
 * @brief 初始化定时器 6
 *
 * 该函数用于对定时器 6 进行初始化配置，包括使能定时器时钟、设置预分频器、
 * 自动重装载值，触发更新事件，清除更新标志位，使能更新中断以及配置 NVIC 中断优先级。
 */
void Driver_TIM6_Init(void)
{
    /* 1. 使能定时器 6 时钟 */
    // 通过设置 RCC 的 APB1 外设时钟使能寄存器，开启定时器 6 的时钟
    RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;

    /* 2. 设置定时器 6 预分频器 */
    // 将预分频器的值设置为 72 - 1，结合系统时钟 72MHz，得到定时器时钟为 1MHz
    TIM6->PSC = 72 - 1;

    /* 3. 设置定时器 6 自动重装载值 */
    // 将自动重装载值设置为 1000 - 1，定时器每计数 1000 次产生一次溢出，即 1ms 产生一次中断
    TIM6->ARR = 1000 - 1;

    /* 4. 触发更新事件并清除更新标志位 */
    // 触发更新事件，使预分频器和自动重装载值的设置立即生效
    TIM6->EGR |= TIM_EGR_UG;
    // 清除更新中断标志位，避免初始化时误触发中断
    TIM6->SR &= ~TIM_SR_UIF;

    /* 5. 使能更新中断 (定时器溢出中断) */
    // 通过设置定时器 6 的 DMA/中断使能寄存器，使能更新中断
    TIM6->DIER |= TIM_DIER_UIE;

    /* 6. 配置 NVIC */
    // 设置 NVIC 中断优先级分组为 3
    NVIC_SetPriorityGrouping(3);
    // 设置定时器 6 中断的优先级为 3
    NVIC_SetPriority(TIM6_IRQn, 3);
    // 使能定时器 6 的中断
    NVIC_EnableIRQ(TIM6_IRQn);
}

/**
 * @brief 启动定时器 6 的运行
 *
 * 此函数通过设置定时器 6 控制寄存器 1 (TIM6->CR1) 中的使能位 (TIM_CR1_CEN)，
 * 来启动定时器 6 的计数操作。
 */
void Driver_TIM6_Start(void)
{
    // 设置定时器 6 控制寄存器 1 中的使能位，启动定时器计数
    TIM6->CR1 |= TIM_CR1_CEN;
}

/**
 * @brief 停止定时器 6 的运行
 *
 * 此函数通过清除定时器 6 控制寄存器 1 (TIM6->CR1) 中的使能位 (TIM_CR1_CEN)，
 * 来停止定时器 6 的计数操作。
 */
void Driver_TIM6_Stop(void)
{
    // 清除定时器 6 控制寄存器 1 中的使能位，停止定时器计数
    TIM6->CR1 &= ~TIM_CR1_CEN;
}

extern void lv_tick_inc(uint32_t tick_period);

void TIM6_IRQHandler(void)
{
    // 清除中断标志位
    TIM6->SR &= ~TIM_SR_UIF;
    // 这个函数几ms调用一次,就传入数字几个
    // 上面是1mhz,ARR = 1000, 所以是1ms调用一次
    lv_tick_inc(1);

    lv_timer_handler();
}
